/**************************************************************************************************
**                                                                                               **
**  文件名称:  dal_can_drv.h                                                                     **
**  版权所有:  CopyRight @ Xiamen Yaxon NetWork CO.LTD. 2017                                     **
**  文件描述:  CAN的驱动管理                                                                     **
**  ===========================================================================================  **
**  创建信息:  | 2017-8-3 | LEON | 创建本模块                                                    **
**  ===========================================================================================  **
**  修改信息:  单击此处添加....                                                                  **
**************************************************************************************************/
#ifndef DAL_CAN_DRV_H
#define DAL_CAN_DRV_H

/*************************************************************************************************/
/*                           模块宏定义                                                          */
/*************************************************************************************************/
#define MAX_CAN_DLEN         8                                                 /* CAN数据最大长度 */

#define MAX_FILTER_BANK      14                                                /* 滤波器组个数 */

#define LIST_STD_FILTER     (MAX_FILTER_BANK * 4)                              /* 标准帧滤波ID的列表类型个数 */
#define MASK_STD_FILTER     (MAX_FILTER_BANK * 2)                              /* 标准帧滤波ID的掩码类型个数 */

#define LIST_EXT_FILTER     (MAX_FILTER_BANK * 2)                              /* 扩展帧滤波ID的列表类型个数 */
#define MASK_EXT_FILTER     (MAX_FILTER_BANK * 1)                              /* 扩展帧滤波ID的掩码类型个数 */

/*************************************************************************************************/
/*                           错误类型                                                            */
/*************************************************************************************************/
typedef enum {
    CAN_ERROR_NOERR = 0,                                                       /* 正常 */ 
    CAN_ERROR_STUFF,                                                           /* 位填充错误 */ 
    CAN_ERROR_FORM,                                                            /* 格式错误 */ 
    CAN_ERROR_ACK,                                                             /* 确认错误 */ 
    CAN_ERROR_BITRECESSIVE,                                                    /* 隐性位错误 */ 
    CAN_ERROR_BITDOMINANT,                                                     /* 显性位错误 */ 
    CAN_ERROR_CRC,                                                             /* CRC错误 */ 
    CAN_ERROR_SOFTWARESET,                                                     /* 软件设置错误 */ 
    CAN_ERROR_MAX
} CAN_ERRTYP_E;

/*************************************************************************************************/
/*                           错误状态                                                            */
/*************************************************************************************************/
typedef enum {
    CAN_ERR_STAT_NOERR = 0,                                                    /* 正常 */ 
    CAN_ERR_STAT_WARNING,                                                      /* 警告错误 */ 
    CAN_ERR_STAT_ACTIVE,                                                       /* 主动错误 */ 
    CAN_ERR_STAT_PASSIVE,                                                      /* 被动错误 */ 
    CAN_ERR_STAT_BUSOFF,                                                       /* 总线关闭 */ 
    CAN_ERR_STAT_MAX
} CAN_ERRSTT_E;

/*************************************************************************************************/
/*                           CAN工作模式                                                         */
/*************************************************************************************************/
typedef enum {
    CAN_WKMODE_NORMAL = 0,                                                     /* 正常模式 */
    CAN_WKMODE_LOOPBACK,                                                       /* 环回模式 */
    CAN_WKMODE_SILENT,                                                         /* 静默模式 */
    CAN_WKMODE_STLPBK,                                                         /* 静默环回模式 */
    CAN_WKMODE_MAX
} CAN_WKMODE_E;

/*************************************************************************************************/
/*                           CAN帧类型                                                           */
/*************************************************************************************************/
typedef enum {
    CAN_STD_FAMRE = 0x01,                                                      /* 标准帧 */
    CAN_EXT_FAMRE = 0x02                                                       /* 扩展帧 */
} CAN_DTTYPE_E;

/*************************************************************************************************/
/*                           CAN帧格式                                                           */
/*************************************************************************************************/
typedef enum {
    CAN_DATA_FORMAT = 0x01,                                                    /* 数据帧 */
    CAN_REMO_FORMAT = 0x02                                                     /* 远程帧 */
} CAN_FORMAT_E;

/*************************************************************************************************/
/*                           CAN滤波模式                                                         */
/*************************************************************************************************/
typedef enum {
    CAN_FILT_NONE = 0x01,                                                      /* 不做滤波 */
    CAN_FILT_LIST = 0x02,                                                      /* 列表滤波 */
    CAN_FILT_MASK = 0x03                                                       /* 掩码滤波 */
} CAN_FTMODE_E;

/*************************************************************************************************/
/*                           CAN工作参数                                                         */
/*************************************************************************************************/
typedef struct {
    CAN_WKMODE_E       mode;                                                   /* 工作模式 */
    INT32U             baud;                                                   /* 波特率 */
    CAN_DTTYPE_E       type;                                                   /* 帧类型 */
} CAN_CONFIG_T;

/*************************************************************************************************/
/*                           接收结构体                                                          */
/*************************************************************************************************/
typedef struct {
    INT32U             id;                                                     /* 帧ID */
    CAN_DTTYPE_E       dttype;                                                 /* 帧类型 */
    CAN_FORMAT_E       format;                                                 /* 帧格式 */
    INT8U              dlc;                                                    /* 数据长度 */
    INT8U              data[MAX_CAN_DLEN];                                     /* 帧数据 */
} CAN_DATA_T;

/*************************************************************************************************/
/*                           总线状态                                                            */
/*************************************************************************************************/
typedef struct {
    BOOLEAN            stt;                                                    /* 总线状态, TRUE-开启, FALSE-关闭 */
    CAN_ERRTYP_E       lec;                                                    /* 最后(当前)错误码 */
    CAN_ERRSTT_E       err;                                                    /* 错误等级 */
    INT8U              tec;                                                    /* 发送错误计数器 */
    INT8U              rec;                                                    /* 接收错误计数器 */
} CAN_STATUS_T;

void DAL_CAN_Init(void);
BOOLEAN DAL_CAN_OpenCan(CAN_CONFIG_T *cfg);
BOOLEAN DAL_CAN_CloseCan(void);
BOOLEAN DAL_CAN_IsOpened(void);
BOOLEAN DAL_CAN_SetFilterParaByList(INT8U idtype, INT8U idnum, INT32U *pfilterid);
BOOLEAN DAL_CAN_SetFilterParaByMask(INT8U idtype, INT8U idnum, INT32U *pfilterid, INT32U *pmaskid);
BOOLEAN DAL_CAN_ReadData(CAN_DATA_T *data);
BOOLEAN DAL_CAN_SendData(CAN_DATA_T *data);
INT32U DAL_CAN_UsedOfRecvbuf(void);
INT32U DAL_CAN_LeftOfSendbuf(void);
BOOLEAN DAL_CAN_GetStatus(CAN_STATUS_T *info);

#endif


